/*
 * This file Copyright (C) 2007-2010 Mnemosyne LLC
 *
 * This file is licensed by the GPL version 2.  Works owned by the
 * Transmission project are granted a special exemption to clause 2(b)
 * so that the bulk of its code can remain under the MIT license.
 * This exemption does not extend to derived works not owned by
 * the Transmission project.
 *
 * $Id: hig.c 9868 2010-01-04 21:00:47Z charles $
 */

#include <gtk/gtk.h>
#include "hig.h"
#include "util.h"

GtkWidget *hig_workarea_create(void)
{
    GtkWidget *t = gtk_table_new(1, 2, FALSE);

    gtk_container_set_border_width(GTK_CONTAINER(t), GUI_PAD_BIG);
    gtk_table_set_col_spacing(GTK_TABLE(t), 0, GUI_PAD_BIG);
    gtk_table_set_row_spacings(GTK_TABLE(t), GUI_PAD);
    return t;
}

void hig_workarea_add_section_divider(GtkWidget * t, guint * row)
{
    GtkWidget *w = gtk_alignment_new(0.0f, 0.0f, 0.0f, 0.0f);

    gtk_widget_set_size_request(w, 0u, 6u);
    gtk_table_attach(GTK_TABLE(t), w, 0, 2, *row, *row + 1, 0, 0, 0, 0);
    ++*row;
}

void
hig_workarea_add_section_title_widget(GtkWidget * t, guint * row,
                                      GtkWidget * w)
{
    gtk_table_attach(GTK_TABLE(t), w, 0, 2, *row, *row + 1, ~0, 0, 0, 0);
    ++*row;
}

void
hig_workarea_add_section_title(GtkWidget * t,
                               guint * row, const char *section_title)
{
    char buf[512];
    GtkWidget *l;

    g_snprintf(buf, sizeof(buf), "<b>%s</b>", section_title);
    l = gtk_label_new(buf);
    gtk_misc_set_alignment(GTK_MISC(l), 0.0f, 0.5f);
    gtk_label_set_use_markup(GTK_LABEL(l), TRUE);
    hig_workarea_add_section_title_widget(t, row, l);
}

static GtkWidget *rowNew(GtkWidget * w)
{
    GtkWidget *a;
    GtkWidget *h = trg_hbox_new(FALSE, 0);

    /* spacer */
    a = gtk_alignment_new(0.0f, 0.0f, 0.0f, 0.0f);
    gtk_widget_set_size_request(a, 18u, 0u);
    gtk_box_pack_start(GTK_BOX(h), a, FALSE, FALSE, 0);

    /* lhs widget */
    if (GTK_IS_MISC(w))
        gtk_misc_set_alignment(GTK_MISC(w), 0.0f, 0.5f);
    if (GTK_IS_LABEL(w))
        gtk_label_set_use_markup(GTK_LABEL(w), TRUE);
    gtk_box_pack_start(GTK_BOX(h), w, TRUE, TRUE, 0);

    return h;
}

void hig_workarea_add_wide_control(GtkWidget * t, guint * row,
                                   GtkWidget * w)
{
    GtkWidget *r = rowNew(w);

    gtk_table_attach(GTK_TABLE(t), r, 0, 2, *row, *row + 1, GTK_FILL,
                     0, 0, 0);
    ++*row;
}

void
hig_workarea_add_wide_tall_control(GtkWidget * t, guint * row,
                                   GtkWidget * w)
{
    GtkWidget *r = rowNew(w);

    gtk_table_attach(GTK_TABLE(t), r, 0, 2, *row, *row + 1,
                     GTK_EXPAND | GTK_SHRINK | GTK_FILL,
                     GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);

    ++*row;
}

GtkWidget *hig_workarea_add_wide_checkbutton(GtkWidget * t,
                                             guint * row,
                                             const char *mnemonic_string,
                                             gboolean is_active)
{
    GtkWidget *w = gtk_check_button_new_with_mnemonic(mnemonic_string);

    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), is_active);
    hig_workarea_add_wide_control(t, row, w);
    return w;
}

void hig_workarea_add_label_w(GtkWidget * t, guint row, GtkWidget * l)
{
    GtkWidget *w = rowNew(l);

    gtk_table_attach(GTK_TABLE(t), w, 0, 1, row, row + 1, GTK_FILL,
                     GTK_FILL, 0, 0);
}

GtkWidget *hig_workarea_add_label(GtkWidget * t, guint row,
                                  const char *mnemonic_string)
{
    GtkWidget *l = gtk_label_new_with_mnemonic(mnemonic_string);

    hig_workarea_add_label_w(t, row, l);
    return l;
}

static void
hig_workarea_add_tall_control(GtkWidget * t, guint row,
                              GtkWidget * control)
{
    if (GTK_IS_MISC(control))
        gtk_misc_set_alignment(GTK_MISC(control), 0.0f, 0.5f);

    gtk_table_attach(GTK_TABLE(t), control,
                     1, 2, row, row + 1,
                     GTK_EXPAND | GTK_SHRINK | GTK_FILL,
                     GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
}

void hig_workarea_add_control(GtkWidget * t, guint row,
                              GtkWidget * control)
{
    if (GTK_IS_MISC(control))
        gtk_misc_set_alignment(GTK_MISC(control), 0.0f, 0.5f);

    gtk_table_attach(GTK_TABLE(t), control,
                     1, 2, row, row + 1,
                     GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0, 0);
}

void
hig_workarea_add_row_w(GtkWidget * t,
                       guint * row,
                       GtkWidget * label,
                       GtkWidget * control, GtkWidget * mnemonic)
{
    hig_workarea_add_label_w(t, *row, label);
    hig_workarea_add_control(t, *row, control);
    if (GTK_IS_LABEL(label))
        gtk_label_set_mnemonic_widget(GTK_LABEL(label),
                                      mnemonic ? mnemonic : control);
    ++*row;
}

GtkWidget *hig_workarea_add_row(GtkWidget * t,
                                guint * row,
                                const char *mnemonic_string,
                                GtkWidget * control, GtkWidget * mnemonic)
{
    GtkWidget *l = gtk_label_new_with_mnemonic(mnemonic_string);

    hig_workarea_add_row_w(t, row, l, control, mnemonic);
    return l;
}

GtkWidget *hig_workarea_add_tall_row(GtkWidget * table,
                                     guint * row,
                                     const char *mnemonic_string,
                                     GtkWidget * control,
                                     GtkWidget * mnemonic)
{
    GtkWidget *l = gtk_label_new_with_mnemonic(mnemonic_string);
    GtkWidget *h = trg_hbox_new(FALSE, 0);
    GtkWidget *v = trg_vbox_new(FALSE, 0);
    gtk_box_pack_start(GTK_BOX(h), l, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(v), h, FALSE, FALSE, GUI_PAD_SMALL);

    hig_workarea_add_label_w(table, *row, v);
    hig_workarea_add_tall_control(table, *row, control);

    if (GTK_IS_LABEL(l))
        gtk_label_set_mnemonic_widget(GTK_LABEL(l),
                                      mnemonic ? mnemonic : control);

    ++*row;
    return l;
}

void hig_workarea_finish(GtkWidget * t, guint * row)
{
    gtk_table_resize(GTK_TABLE(t), *row, 2);
}

void
hig_message_dialog_set_text(GtkMessageDialog * dialog,
                            const char *primary, const char *secondary)
{
    gtk_message_dialog_set_markup(dialog, primary);
    gtk_message_dialog_format_secondary_text(dialog, "%s", secondary);
}
